package org.online.listener;

import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;

import org.online.conmon.Const;
import org.online.entity.User;

/**
 * 监听用户登录时，把登录的帐号添加到Map集合中
 * 
 * 什么时候登录成功呢？我们怎样知道呢？ -- 利用会话属性操作的监听器 - 监听会话的setAttribute方法
 * 
 * @author Administrator
 *
 */
@WebListener
public class OnlineUserListener implements HttpSessionAttributeListener{

	/**
	 * 以下方法，用于监听处理会话对象的setAttribute方法
	 */
	@Override
	public void attributeAdded(HttpSessionBindingEvent se) {
		// 1.从会话中获取登录用户
		HttpSession session = se.getSession() ;
		User user = (User)session.getAttribute(Const.LOGIN_USER) ;
		
		// 2.从上下文对象中，获取那个Map集合
		ServletContext context = session.getServletContext() ;
		@SuppressWarnings("unchecked")
		Map<String,User> map = (Map<String,User>)context.getAttribute(Const.ONLINE_USER_MAP) ;
		
		// 3.把登录用户，添加Map集合中
		map.put(user.getUsername(), user);
		
		// 4.把Map集合重新存储到上下文对象中，更新数据
		context.setAttribute(Const.ONLINE_USER_MAP, map);
		
	}

	@Override
	public void attributeRemoved(HttpSessionBindingEvent se) {
				
	}

	/**
	 * 用户切换时，需要更新在线用户列表
	 */
	@Override
	public void attributeReplaced(HttpSessionBindingEvent se) {
		// 第一：获取切换之前的用户
		User oldUser = (User)se.getValue();
		
		// 第二：获取切换之后的用户
		HttpSession session = se.getSession() ;
		User newUser = (User)session.getAttribute(Const.LOGIN_USER) ;
		
		// 第三：获取上下对象的map集合
		ServletContext context = session.getServletContext();
		@SuppressWarnings("unchecked")
		Map<String,User> map = (Map<String,User>)context.getAttribute(Const.ONLINE_USER_MAP) ;
		
		// 第四：移除切换之前的用户
		if(oldUser!=null) {
			map.remove(oldUser.getUsername()) ;
		}
		    
		// 第五：添加切换之后的用户
		if(newUser!=null) {
			map.put(newUser.getUsername(), newUser);
		}
		
		// 第六：更新map集合到上下文对象中
		context.setAttribute(Const.ONLINE_USER_MAP, map);
		
	}

}
